home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / sndhrdw / z80bw.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  4KB  |  176 lines

  1. /* z80bw.c *********************************
  2.  updated: 1997-04-09 08:46 TT
  3.  updated  20-3-1998 LT Added colour changes on base explosion
  4.  updated  02-6-1998 HJB copied from 8080bw and removed unneeded code
  5.  *
  6.  * Author      : Tormod Tjaberg
  7.  * Created     : 1997-04-09
  8.  * Description : Sound routines for the 'astinvad' games
  9.  *
  10.  * Note:
  11.  * The samples were taken from Michael Strutt's (mstrutt@pixie.co.za)
  12.  * excellent space invader emulator and converted to signed samples so
  13.  * they would work under SEAL. The port info was also gleaned from
  14.  * his emulator. These sounds should also work on all the invader games.
  15.  *
  16.  * The sounds are generated using output port 3 and 5
  17.  *
  18.  * Port 4:
  19.  * bit 0=UFO  (repeats)       0.raw
  20.  * bit 1=Shot                 1.raw
  21.  * bit 2=Base hit             2.raw
  22.  * bit 3=Invader hit          3.raw
  23.  * bit 5=global enable?????
  24.  *
  25.  * Port 5:
  26.  * bit 0=Fleet movement 1     4.raw
  27.  * bit 1=Fleet movement 2     5.raw
  28.  * bit 2=Fleet movement 3     6.raw
  29.  * bit 3=Fleet movement 4     7.raw
  30.  * bit 4=UFO 2                8.raw
  31.  * but 5=screen flip           n/a
  32.  */
  33.  
  34. #include "driver.h"
  35.  
  36.  
  37. void invaders_flipscreen_w(int data);
  38. void invaders_screen_red_w(int data);
  39.  
  40.  
  41. /* output port 0x04 definitions - sound effect drive outputs */
  42. #define OUT_PORT_4_UFO            0x01
  43. #define OUT_PORT_4_SHOT            0x02
  44. #define OUT_PORT_4_BASEHIT        0x04
  45. #define OUT_PORT_4_INVADERHIT    0x08
  46. #define OUT_PORT_4_UNUSED        0xf0
  47.  
  48. /* output port 0x05 definitions - sound effect drive outputs */
  49. #define OUT_PORT_5_FLEET1        0x01
  50. #define OUT_PORT_5_FLEET2        0x02
  51. #define OUT_PORT_5_FLEET3        0x04
  52. #define OUT_PORT_5_FLEET4        0x08
  53. #define OUT_PORT_5_UFO2            0x10
  54. #define OUT_PORT_5_FLIP            0x20
  55. #define OUT_PORT_5_UNUSED        0xc0
  56.  
  57.  
  58. #define PLAY(id,loop)           sample_start( id, id, loop )
  59. #define STOP(id)                sample_stop( id )
  60.  
  61.  
  62. static const char *astinvad_sample_names[] =
  63. {
  64.     "*invaders",
  65.     "0.wav",
  66.     "1.wav",
  67.     "2.wav",
  68.     "3.wav",
  69.     "4.wav",
  70.     "5.wav",
  71.     "6.wav",
  72.     "7.wav",
  73.     "8.wav",
  74.     0       /* end of array */
  75. };
  76.  
  77. struct Samplesinterface astinvad_samples_interface =
  78. {
  79.     9,    /* 9 channels */
  80.     25,    /* volume */
  81.     astinvad_sample_names
  82. };
  83.  
  84.  
  85. /* sample sound IDs - must match sample file name table above */
  86. enum
  87. {
  88.     SND_UFO = 0,
  89.     SND_SHOT,
  90.     SND_BASEHIT,
  91.     SND_INVADERHIT,
  92.     SND_FLEET1,
  93.     SND_FLEET2,
  94.     SND_FLEET3,
  95.     SND_FLEET4,
  96.     SND_UFO2
  97. };
  98.  
  99.  
  100. /* LT 20-3-1998 */
  101. WRITE_HANDLER( astinvad_sh_port_4_w )
  102. {
  103.     static int port4State;
  104.  
  105.     int bitsChanged;
  106.     int bitsGoneHigh;
  107.     int bitsGoneLow;
  108.  
  109.  
  110.     bitsChanged  = port4State ^ data;
  111.     bitsGoneHigh = bitsChanged & data;
  112.     bitsGoneLow  = bitsChanged & ~data;
  113.  
  114.     port4State = data;
  115.  
  116.  
  117.     if ( bitsGoneHigh & OUT_PORT_4_UFO )  PLAY( SND_UFO, 1 );
  118.     if ( bitsGoneLow  & OUT_PORT_4_UFO )  STOP( SND_UFO );
  119.  
  120.     if ( bitsGoneHigh & OUT_PORT_4_SHOT )  PLAY( SND_SHOT, 0 );
  121.     if ( bitsGoneLow  & OUT_PORT_4_SHOT )  STOP( SND_SHOT );
  122.  
  123.     if ( bitsGoneHigh & OUT_PORT_4_BASEHIT )
  124.     {
  125.         PLAY( SND_BASEHIT, 0 );
  126.         /* turn all colours red here */
  127.         invaders_screen_red_w(1);
  128.     }
  129.     if ( bitsGoneLow & OUT_PORT_4_BASEHIT )
  130.     {
  131.         STOP( SND_BASEHIT );
  132.         /* restore colours here */
  133.         invaders_screen_red_w(0);
  134.     }
  135.  
  136.     if ( bitsGoneHigh & OUT_PORT_4_INVADERHIT )  PLAY( SND_INVADERHIT, 0 );
  137.     if ( bitsGoneLow  & OUT_PORT_4_INVADERHIT )  STOP( SND_INVADERHIT );
  138.  
  139.     if ( bitsChanged & OUT_PORT_4_UNUSED ) logerror("Snd Port 4 = %02X\n", data & OUT_PORT_4_UNUSED);
  140. }
  141.  
  142.  
  143.  
  144. WRITE_HANDLER( astinvad_sh_port_5_w )
  145. {
  146.     static int port5State;
  147.  
  148.     int bitsChanged;
  149.     int bitsGoneHigh;
  150.     int bitsGoneLow;
  151.  
  152.  
  153.     bitsChanged  = port5State ^ data;
  154.     bitsGoneHigh = bitsChanged & data;
  155.     bitsGoneLow  = bitsChanged & ~data;
  156.  
  157.     port5State = data;
  158.  
  159.  
  160.     if ( bitsGoneHigh & OUT_PORT_5_FLEET1 )  PLAY( SND_FLEET1, 0 );
  161.  
  162.     if ( bitsGoneHigh & OUT_PORT_5_FLEET2 )  PLAY( SND_FLEET2, 0 );
  163.  
  164.     if ( bitsGoneHigh & OUT_PORT_5_FLEET3 )  PLAY( SND_FLEET3, 0 );
  165.  
  166.     if ( bitsGoneHigh & OUT_PORT_5_FLEET4 )  PLAY( SND_FLEET4, 0 );
  167.  
  168.     if ( bitsGoneHigh & OUT_PORT_5_UFO2 )  PLAY( SND_UFO2, 0 );
  169.     if ( bitsGoneLow  & OUT_PORT_5_UFO2 )  STOP( SND_UFO2 );
  170.  
  171.     if ( bitsChanged  & OUT_PORT_5_FLIP )  invaders_flipscreen_w(data & 0x20);
  172.  
  173.     if ( bitsChanged  & OUT_PORT_5_UNUSED ) logerror("Snd Port 5 = %02X\n", data & OUT_PORT_5_UNUSED);
  174. }
  175.  
  176.